/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.daoImpl;

import com.evangelion.core.bean.Alumno;
import com.evangelion.core.bean.Examen;
import com.evangelion.core.bean.Profesor;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.dao.ExamenDao;
import com.evangelion.core.pojo.ExamenPracticoSearchForm;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Query;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Usuario
 */
@Component
@Transactional
public class ExamenDaoImpl extends AbstractDAO<Examen> implements ExamenDao {

    @Override
    public List<Profesor> findProfessor(ExamenPracticoSearchForm form, List<String> pruebaList) {
        String sql = "select distinct p from Profesor p inner join Examen a where a.profesor.id = p.id ";
        Query q = buildQuery(sql, form.getProfessor(), form.getSeccion(), form.getFechaDesde(), form.getFechaHasta(), pruebaList);
        return q.getResultList();

    }

    private Query buildQuery(String sql, Profesor profesor, Seccione seccion, Date fechadesde, Date fechahasta, List<String> pruebaList) {
        Map<String, Object> pMap = new HashMap<String, Object>();

        if (null != profesor) {
            sql += " and a.profesor = :profesor ";
            pMap.put("profesor", profesor);
        }

        if (null != seccion) {
            sql += " and a.seccion = :seccion ";
            pMap.put("seccion", seccion);
        }

        if (null != fechadesde) {
            sql += " and a.fechaexamen >= :fechadesde ";
            pMap.put("fechadesde", fechadesde);
        }

        if (null != fechahasta) {
            sql += " and a.fechaexamen <= :fechahasta ";
            pMap.put("fechahasta", fechahasta);
        }

        if (null != pruebaList) {
            if (pruebaList.size() == 1) {
                sql += " and a.prueba = :prueba ";
                pMap.put("prueba", pruebaList.get(0));
            } else {
                sql += " and a.prueba in :prueba ";
                pMap.put("prueba", pruebaList);
            }
        }

        Query q = em.createQuery(sql);

        for (String key : pMap.keySet()) {
            q.setParameter(key, pMap.get(key));
        }
        return q;
    }

    @Override
    public List<Examen> findByRangeDate(Profesor profesor, Seccione seccion, Date fechadesde, Date fechahasta, List<String> pruebaList) {
        String sql = "SELECT a from Examen a WHERE 1=1 ";
        Query q = buildQuery(sql, profesor, seccion, fechadesde, fechahasta, pruebaList);
        return q.getResultList();
    }

    @Override
    public List<Examen> findByAlumnoEstado(Seccione seccion, Alumno alumno, String estado) {
        Query q = em.createQuery("SELECT a from Examen a WHERE a.seccion = :seccion AND a.alumno=:alumno AND a.estadoexamen=:estado");

        q.setParameter("seccion", seccion);
        q.setParameter("alumno", alumno);
        q.setParameter("estado", estado);
        return q.getResultList();
    }

    @Override
    public List<Object[]> examenResultadoMensual(Seccione seccion, Date fechadesde, Date fechahasta) {
        Query q = em.createNativeQuery("select COUNT(id), MONTH(fechaexamen), resultado from examenes WHERE resultado is NOT NULL AND fechaexamen>=? AND fechaexamen<=? AND id_seccion=? GROUP BY (YEAR(fechaexamen)),(MONTH(fechaexamen)), resultado");

        q.setParameter(1, fechadesde);
        q.setParameter(2, fechahasta);
        q.setParameter(3, seccion.getId());
        return q.getResultList();
    }

    @Override
    public Examen findObjByParam(String parametro, String valor) {
        return findObjByParam(Examen.class, parametro, valor);
    }

    @Override
    public List<Examen> findListByParam(String parametro, String valor) {
        return findListByParam(Examen.class, parametro, valor);
    }
}
